#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=310;
struct node{
	int x,y,z;
	bool operator<(const struct node& p1)
	{
		return z<p1.z;
	}
};
vector<node> edge;
int n,m;
int f[N];
int cnt,maxd;
int Find(int x)
{
	if(f[x]!=x)
		f[x]=Find(f[x]);
	return f[x];
}
void kluscal()
{
	for(int i=0;i<edge.size();i++)
	{
		int a=edge[i].x,b=edge[i].y;
		a=Find(a),b=Find(b);
		if(a!=b)
		{
			f[a]=b;
			cnt++;
			maxd=max(maxd,edge[i].z);
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		edge.push_back({a,b,c});
	}
	sort(edge.begin(),edge.end());
	for(int i=1;i<=n;i++)
		f[i]=i;
	
	kluscal();
	cout<<cnt<<' '<<maxd<<endl;
	
	
	return 0;
}
